.MODEL small;
.DATA;

msj_1 db 'No es posible completar la conversion sin perder informacion$';
msj_2 db 'Overflow producido en la operacion$';
msj_3 db 'Division por cero$';

_b dd ?;	(Id long)
_a dd ?;	(Id long)
_2 dd 2;	(Cte long)
_1 dd 1;	(Cte long)
_0 dd 0;	(Cte long)
_random dd ?;	(Id ulong)
_neg1 dd -1;	(Cte long)
salida db 0;	(salida del programa)

.CODE;
.486;

errConversion:	;
MOV DX, OFFSET msj_1;
MOV AH, 09H;
INT 21H;
MOV AH,4CH;
MOV AL,1H;
INT 21H;
MOV salida, 1;
JMP finalize;

errOverflow:	;
MOV DX, OFFSET msj_2;
MOV AH, 09H;
INT 21H;
MOV AH,4CH;
MOV AL,1H;
INT 21H;
MOV salida, 2;
JMP finalize;

errZero:	;
MOV DX, OFFSET msj_3;
MOV AH, 09H;
INT 21H;
MOV AH,4CH;
MOV AL,1H;
INT 21H;
MOV salida, 3;
JMP finalize;

start:	;
MOV AX, @data;	(start)
MOV DS, AX;	(start)
MOV EAX, _0;	(terceto 1)
MOV _a, EAX;	(terceto 1)
MOV EAX, _0;	(terceto 2)
MOV _b, EAX;	(terceto 2)
MOV EAX, _1;	(terceto 3)
ADD EAX, _b;	(terceto 3)
JO errOverflow;	(terceto 3)
MOV EBX, EAX;	(terceto 3)
MOV EAX, EBX;	(terceto 4)
CMP EAX, _a;	(terceto 4)
JGE terceto23;	(terceto 5)
MOV EAX, _1;	(terceto 6)
ADD EAX, _b;	(terceto 6)
JO errOverflow;	(terceto 6)
MOV EBX, EAX;	(terceto 6)
MOV EAX, EBX;	(terceto 7)
CMP EAX, _a;	(terceto 7)
JGE terceto12;	(terceto 8)
MOV EAX, _1;	(terceto 9)
ADD EAX, _a;	(terceto 9)
JO errOverflow;	(terceto 9)
MOV EBX, EAX;	(terceto 9)
MOV EAX, EBX;	(terceto 10)
MOV _a, EAX;	(terceto 10)
JMP terceto22;	(terceto 11)
terceto12:	;
MOV EAX, _random;	(terceto 12)
ADD EAX, _a;	(terceto 12)
JC errOverflow;	(terceto 12)
MOV EBX, EAX;	(terceto 12)
MOV EAX, EBX;	(terceto 13)
MOV _a, EAX;	(terceto 13)
MOV EAX, _b;	(terceto 14)
CMP EAX, _random;	(terceto 14)
JB errOverflow;	(terceto 14)
SUB EAX, _random;	(terceto 14)
JC errOverflow;	(terceto 14)
MOV EBX, EAX;	(terceto 14)
MOV EAX, EBX;	(terceto 15)
MOV _b, EAX;	(terceto 15)
MOV EAX, _b;	(terceto 16)
CMP EAX, _a;	(terceto 16)
JNE terceto12;	(terceto 17)
MOV EAX, _neg1;	(terceto 18)
IMUL _a;	(terceto 18)
JO errOverflow;	(terceto 18)
MOV EBX, EAX;	(terceto 18)
MOV EAX, _b;	(terceto 19)
CMP _2, 0;	(terceto 19)
JZ errZero;	(terceto 19)
IDIV _2;	(terceto 19)
MOV ECX, EAX;	(terceto 19)
MOV EAX, ECX;	(terceto 20)
ADD EAX, EBX;	(terceto 20)
JO errOverflow;	(terceto 20)
MOV EBX, EAX;	(terceto 20)
MOV EAX, EBX;	(terceto 21)
MOV _b, EAX;	(terceto 21)
terceto22:	;
JMP terceto25;	(terceto 22)
terceto23:	;
MOV EAX, _0;	(terceto 23)
MOV _a, EAX;	(terceto 23)
MOV EAX, _0;	(terceto 24)
MOV _b, EAX;	(terceto 24)
terceto25:	;
MOV EAX, _neg1;	(terceto 25)
IMUL _a;	(terceto 25)
JO errOverflow;	(terceto 25)
MOV EBX, EAX;	(terceto 25)
MOV EAX, EBX;	(terceto 26)
MOV _b, EAX;	(terceto 26)
JMP finalize;	(finalizar programa)

finalize:	;
MOV AL, salida;
MOV AH, 4CH;
INT 21H;
END start	;